package rtti;

import framework.AbstractTest;
import utils.Log;

/**
 * Created by shane on 2018/6/11.
 */

class Candy {
    static {
        Log.vn("Loading Candy");
    }
}

class Gum {
    static {
        Log.vn("Loading Gum");
    }
}


class Cookie {
    static {
        Log.vn("Loading Cookie");
    }
}

/**
 * java程序在运行时并非加载所有的类， 在必需时才加载。这一点与许多传统语言都不同。
 * 动态加载使能的行为，在诸如C++这样的静态加载语言中是很难或者根本不可能复制的
 */
public class SweetShope extends AbstractTest {
    @Override
    public void test(String[] args) {
        super.test(args);
        Log.vn("inside main");
        /**
         * 使用new操作符创建类的新对象也会被当做对类的静态成员的引用
         */
        new Candy();

        Log.vn("After creating Candy");

        try {
            Class.forName("rtti.Gum");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            Log.vn("Couldn't find Gum");
        }

        Log.vn("After Class.forName(\"Gum\")");

        new Cookie();
        Log.vn("After creating Cookie");

        /**
         * 不会输出 Loading Cookie
         */
        new Cookie();


        /**
         * 不会输出 Loading Gum
         */
        try {
            Class.forName("rtti.Gum");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            Log.vn("Couldn't find Gum");
        }
    }
}
